#ifndef _TIMER_H_
#define _TIMER_H_

#include <pc.h>
#include "timer.h"
#include "ints.h"
#include "jogo.h"

extern int time_tick;
extern volatile Bool novo_step;

extern _go32_dpmi_seginfo timer0_new_irq;
extern _go32_dpmi_seginfo timer0_old_irq;

/** @defgroup Timer Timer
 * @{
 *
 * @brief Módulo dos Timers.
 */

#define TICKS_PER_STEP 20
 
/** @name Endereços de Timer. */
/*@{*/
#define TIMER_0      0x40
#define TIMER_1      0x41
#define TIMER_2      0x42
#define TIMER_CTRL   0x43
/*@}*/

/** @name Controlo do Altifalante e Timer2. */
/*@{*/
#define SPEAKER_CTRL    0x61
#define TIMER2_ENABLE  (1 << 0)
#define SPEAKER_ENABLE (1 << 1)
#define SPEAKER_DISABLE (0 << 0)
/*@}*/

/** @name Algumas definições sobre Timers util. */
/*@{*/
#define TIMER_CLK    1193181
#define LCOM_MODE  0x36
#ifndef LSB_MSB
#define LSB_MSB
#define LSB(i) ((i) & 0xFF)
#define MSB(i) ((i) >> 8)
#endif
/*@}*/

/** Programa o timer (0,1,2) com um modo. */
void timer_init(int timer, int mode);

/** Carrega o timer (0,1,2) com um valor. */
void timer_load(int timer, int value);

/** Aguarda x milisegundos, usando o Timer0 como relógio. */
void mili_sleep(int mili);

/** Aguarda x segundos, usando o Timer0 como relógio. */
void sec_sleep(int secs);

/** Inicia um timer. */
void setTimer(int* timer, int mili);

/** Verifica (e devolve) se o timer foi alcançado, colocando o timer a 0 se afirmativo. */
Bool getTimerReached(int* timer);

/** Inicializa o Timer0. Instala rotina de interrupção. */
void initTimer0( void (*t0_handler)(void) );

/** Termina o Timer0. Desinstala rotina de interrupção. */
void endTimer0();

//void handler_timer0();

/** @} fim do Timer. */

#endif
